package com.gylang.passport.service.token;

import com.gylang.passport.domain.AccessCheck;
import com.gylang.passport.domain.token.BaseToken;

import java.util.Map;

/**
 * @author gylang
 * data 2021/1/4
 */
public interface TokenService<T extends BaseToken> {

    /**
     * 构建token
     *
     * @param token token对象
     * @return redis token
     */
    String createToken(T token);

    /**
     * 获取token对象
     *
     * @param authToken authToken
     * @return token对象
     */
    T getToken(String authToken);

    /**
     * 获取所有的权限
     *
     * @param baseToken 权限
     * @return 所有权限
     */
    Map<String, Long> getAllRight(BaseToken baseToken);

    /**
     * 获取所有的权限
     *
     * @param rightKey 权限key
     * @return 所有权限
     */
    Map<String, Long> getAllRight(String rightKey);

    /**
     * 通过权限进行可访问性校验
     *
     * @param rightKey 权限key
     * @param right    所需权限
     * @return true -> 可访问
     */
    boolean checkAccessByRight(String rightKey, String right);

    /**
     * 通过权限进行可访问性校验
     *
     * @param rightKey 权限key
     * @param right    所需权限
     * @return true -> 可访问
     */
    boolean checkAccessByRight(String rightKey, String... right);

    /**
     * 通过角色进行可访问性校验
     *
     * @param myRole   拥有角色
     * @param needRole 所需角色
     * @return true -> 可访问
     */
    boolean checkAccessByRole(Map<String, Long> myRole, String needRole);

    /**
     * 通过角色进行可访问性校验
     *
     * @param baseToken 拥有角色
     * @param needRole  所需角色
     * @return true -> 可访问
     */
    boolean checkAccessByRole(BaseToken baseToken, String needRole);

    /**
     * 通过角色进行可访问性校验
     *
     * @param myRole   拥有角色
     * @param needRole 所需角色
     * @return true -> 可访问
     */
    boolean checkAccessByRole(Map<String, Long> myRole, String... needRole);

    /**
     * 通过角色/权限进行可访问性校验
     *
     * @param accessCheck 所需权限/角色, 权限和角色复杂组合, 只需登录校验
     * @return true -> 可访问
     */
    boolean checkAccess(AccessCheck accessCheck);

    /**
     * 校验是否登录/授权
     *
     * @param authToken token
     * @return true -> 可访问
     */
    boolean checkLogin(String authToken);

    /**
     * 拼接token
     *
     * @return token
     */
    String assemblyAuthToken(String tokenId);
}
